314643 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

giru0116のブログ

giru0116のブログ

ツェラーの公式

#include<stdio.h>

int zeller(int, int, int); 
	/* ツェラーの公式の処理をする関数のプロトタイプ宣言 */

#define WEEK 7 /* 1週間は7日なので */
#define MAXMOJI 10 /* 最大文字数 */

int main()
{
	int kekka, year, month, day;
	char buffer[MAXMOJI], weekday[WEEK][MAXMOJI] = {
		"日曜日",
		"月曜日",
		"火曜日",
		"水曜日",
		"木曜日",
		"金曜日",
		"土曜日"
	}; /* 結果として0が日曜、1が月曜、…6が土曜なので
		日曜が一番最初としてあります */
	
	printf("ツェラーの公式プログラム\n\n");
	
	printf("何年の何月何日の曜日が知りたいかを入力して下さい\n");
	printf("何年かを入力して下さい--->");
	fgets(buffer, sizeof(buffer), stdin);
	sscanf(buffer, "%d", &year);
	printf("何月かを入力して下さい--->");
	fgets(buffer, sizeof(buffer), stdin);
	sscanf(buffer, "%d", &month);
	printf("何日かを入力して下さい--->");
	fgets(buffer, sizeof(buffer), stdin);
	sscanf(buffer, "%d", &day);
	
	kekka = zeller(year, month, day);
		/* 引数として年、月、日を渡す */
	
	printf("\n%d年%d月%d日は%sです\n", year, month, day, weekday[kekka]);
	/* weekday[kekka]はkekkaが0とすると日曜日となります(二十一章参照) */
	return 0;
}

int zeller(int y, int m, int d)
{
	int value;
	
	if(m == 1 || m == 2) {
		--y; /* 1,2月は前の年の13,14月として扱うため1年戻すために-1をする */
		m += 12; /* 1,2月は前の年の13,14月として扱うため12を足す */
	} 

	value = (y + y / 4 - y / 100 + y / 400 + (13 * m + 8) / 5 + d) % 7;
		/* (年 + 年 / 4 - 年 / 100 + 年 / 400 + (13 * 月 + 8) / 5 + 日)
			を7で割った余りというツェラーの公式そのもの */
	
	return value; /* 公式の結果を戻り値とする */
}


© Rakuten Group, Inc.
X